home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / tex / td187src.lzh / BEZIER.I < prev    next >
Text File  |  1991-12-14  |  27KB  |  688 lines

  1. IMPLEMENTATION MODULE Bezier ;
  2.  
  3. IMPORT mtAppl ;
  4. IMPORT Diverses ;
  5. IMPORT MagicAES ;
  6. IMPORT MagicVDI ;
  7. IMPORT MagicSys ;
  8. IMPORT MathLib0 ;
  9. IMPORT MagicConvert;
  10.  
  11. IMPORT Variablen ;
  12. IMPORT CommonData;
  13. IMPORT HelpModule;
  14. IMPORT Undo;
  15.  
  16. FROM OwnBoxes    IMPORT WaitForDepress, MousePos;
  17. FROM Types       IMPORT TextPosTyp, DrawObjectTyp, CodeAryTyp, ObjectPtrTyp;
  18. FROM BezierCurve IMPORT ComputeBezier;
  19.  
  20. CONST MaxBezPts = 1000;
  21.  
  22. VAR BezierArray : ARRAY [0..2*MaxBezPts+1] OF INTEGER;
  23.     LastMaxX, LastMaxY : INTEGER;     (* Um Ausmaße bestimmen zu können *)
  24.     LastMinX, LastMinY : INTEGER;
  25. (**
  26. PROCEDURE Max(i1, i2 : INTEGER) : INTEGER;
  27. BEGIN
  28.   IF i1>i2 THEN
  29.     RETURN i1;
  30.    ELSE
  31.     RETURN i2;
  32.   END;
  33. END Max;
  34.  
  35. PROCEDURE Min(i1, i2 : INTEGER) : INTEGER;
  36. BEGIN
  37.   IF i1>i2 THEN
  38.     RETURN i2;
  39.    ELSE
  40.     RETURN i1;
  41.   END;
  42. END Min;
  43. **)
  44.  
  45. PROCEDURE PrepareDraw;
  46. (* Draw-Modus = XOR, Mouse Off, Clipping off *)
  47. VAR dum : INTEGER;
  48. BEGIN
  49.   dum := MagicVDI.SetWritemode ( mtAppl.VDIHandle , MagicVDI.XOR ) ;
  50.   MagicVDI.SetClipping ( mtAppl.VDIHandle , CommonData.ClipXY , TRUE) ;
  51.   IF CommonData.ShowBezLine THEN
  52.     dum := MagicVDI.SetLinewidth(mtAppl.VDIHandle, CommonData.LineWidth);
  53.    ELSE
  54.     dum := MagicVDI.SetMarkertype(mtAppl.VDIHandle, MagicVDI.Point);
  55.     dum := MagicVDI.SetMarkerheight(mtAppl.VDIHandle, 11 * CommonData.LineWidth);
  56.   END;
  57.   Diverses.MouseOff;
  58. END PrepareDraw;
  59.  
  60. PROCEDURE FinishDraw;
  61. (* Draw-Modus = Replace, Mouse On, Clipping off *)
  62. VAR dum : INTEGER;
  63. BEGIN
  64.   dum := MagicVDI.SetWritemode ( mtAppl.VDIHandle , MagicVDI.REPLACE ) ;
  65.   IF CommonData.ShowBezLine THEN
  66.     dum := MagicVDI.SetLinewidth(mtAppl.VDIHandle, CommonData.LineWidth);
  67.    ELSE
  68.     dum := MagicVDI.SetMarkertype(mtAppl.VDIHandle, MagicVDI.Point);
  69.     dum := MagicVDI.SetMarkerheight(mtAppl.VDIHandle, 1 * 11);
  70.   END;
  71.   MagicVDI.SetClipping ( mtAppl.VDIHandle , CommonData.ClipXY , FALSE) ;
  72.   Diverses.MouseOn;
  73. END FinishDraw;
  74.  
  75. PROCEDURE BezierCurve();
  76.  
  77. VAR cx, cx2, sx1, sx2, cy, cy2, sy1, sy2, lastx, lasty : INTEGER;
  78.     Points, x , y , dum, picx, picy                    : INTEGER ;
  79.     but                 : BITSET;
  80.     lbut, rbut          : BOOLEAN;
  81.     SurroundRect        : ARRAY [0..3] OF INTEGER;
  82.     xy                  : CodeAryTyp ;
  83.     pkte                : ARRAY [0..5] OF INTEGER;
  84.     i, pos              : INTEGER;
  85.     string              : ARRAY [0..9] OF CHAR;
  86.     FixEndPt,
  87.     FixCtrlPt,
  88.     helptxt             : ARRAY [0..49] OF CHAR;
  89.  
  90. BEGIN
  91.   (* Zunächst den Startpunkt, dann wie bei Line den 2. Punkt holen und
  92.      zum Schluß den dritten Punkt *)
  93.  
  94.   WaitForDepress(sx1, sy1);
  95.  
  96.   pkte[0] := sx1;
  97.   pkte[2] := sx1;
  98.   pkte[1] := sy1;
  99.   pkte[3] := sy1;
  100.   FOR i:=0 TO 3 DO BezierArray[i] := pkte[i]; END;
  101.  
  102.   MagicVDI.SetLineEndstyles ( mtAppl.VDIHandle , MagicVDI.Cornerd , MagicVDI.Cornerd ) ;
  103.   dum := MagicVDI.SetLinetype ( mtAppl.VDIHandle , MagicVDI.Line ) ;
  104.   dum := MagicVDI.SetLinecolor ( mtAppl.VDIHandle , MagicAES.BLACK ) ;
  105.   lastx := sx1; lasty := sy1;
  106.   Diverses.GetHelpText(1, FixEndPt);
  107.   HelpModule.HelpMessage(FixEndPt);
  108. (* Jetzt der 2. Stützpunkt *)
  109.   REPEAT
  110.  
  111.     MousePos (sx2, sy2, picx, picy, lbut, rbut);
  112.     Variablen.Position ( TRUE, sx2, sy2, sx1, sy1 ) ;
  113.     IF (sx2<>sx1) OR (sy2<>sy1) THEN
  114.       IF (sx2<>lastx) OR (sy2<>lasty) THEN (* Flackern vermeiden *)
  115.         PrepareDraw; (* Bereite Ausgabe vor *)
  116.         dum := MagicVDI.SetLinewidth ( mtAppl.VDIHandle , 1 ) ;
  117.         MagicVDI.Polyline ( mtAppl.VDIHandle , 2 , BezierArray  ) ;
  118.         ComputeBezier(BezierArray, 1, sx1, sy1, sx1, sy1,
  119.                       pkte[2], pkte[3], LastMinX, LastMinY,
  120.                       LastMaxX, LastMaxY);
  121.         pkte[2] := sx2; pkte[3] := sy2;
  122.         MagicVDI.Polyline ( mtAppl.VDIHandle , 2 , BezierArray  ) ;
  123.         FinishDraw; (* Zeichnung beendet *)
  124.       END;
  125.     END;
  126.     lastx := sx2; lasty := sy2;
  127.   UNTIL lbut OR rbut;
  128.  
  129.   PrepareDraw; (* Bereite Ausgabe vor *)
  130.   dum := MagicVDI.SetLinewidth ( mtAppl.VDIHandle , 1 ) ;
  131.   MagicVDI.Polyline ( mtAppl.VDIHandle , 2 , BezierArray  ) ;
  132.   FinishDraw; (* Zeichnung beendet *)
  133.  
  134.   IF lbut AND NOT rbut THEN
  135.     (* Warten bis Maus losgelassen *)
  136.     REPEAT
  137.       MousePos(cx, cy, picx, picy, lbut, rbut);
  138.     UNTIL NOT (lbut OR rbut);
  139.     lastx := cx;
  140.     lasty := cy;
  141.     IF (sx2<sx1) THEN
  142.       dum := sx2; sx2 := sx1; sx1 := dum;
  143.       dum := sy2; sy2 := sy1; sy1 := dum;
  144.     END;
  145.     ComputeBezier(BezierArray, 20, sx1, sy1, cx, cy, sx2, sy2,
  146.                   LastMinX, LastMinY, LastMaxX, LastMaxY);
  147.     pkte[4] := pkte[2];
  148.     pkte[5] := pkte[3];
  149.     pkte[2] := cx;
  150.     pkte[3] := cy;
  151.  
  152.     PrepareDraw; (* Bereite Ausgabe vor *)
  153.     dum := MagicVDI.SetLinewidth ( mtAppl.VDIHandle , CommonData.LineWidth ) ;
  154.     MagicVDI.Polyline ( mtAppl.VDIHandle , 21 , BezierArray  ) ;
  155.     dum := MagicVDI.SetLinewidth ( mtAppl.VDIHandle , 1 ) ;
  156.     MagicVDI.Polyline ( mtAppl.VDIHandle , 3 , pkte  ) ;
  157.     FinishDraw; (* Zeichnung beendet *)
  158.  
  159.     Diverses.GetHelpText(2, FixCtrlPt);
  160.     HelpModule.HelpMessage(FixCtrlPt);
  161.   (* Und nun der Kontrollpunkt *)
  162.     REPEAT
  163.  
  164.       MousePos ( cx, cy, picx, picy, lbut, rbut );
  165.       Variablen.Position (TRUE, cx, cy, sx1, sy1 ) ;
  166.       IF (cx<>sx2) OR (cy<>sy2) THEN
  167.         IF (cx<>lastx) OR (cy<>lasty) THEN
  168.           PrepareDraw; (* Bereite Ausgabe vor *)
  169.           dum := MagicVDI.SetLinewidth ( mtAppl.VDIHandle , 1 ) ;
  170.           MagicVDI.Polyline ( mtAppl.VDIHandle , 3 , pkte  ) ;
  171.           dum := MagicVDI.SetLinewidth ( mtAppl.VDIHandle , CommonData.LineWidth ) ;
  172.           MagicVDI.Polyline ( mtAppl.VDIHandle , 21 , BezierArray  ) ;
  173.           pkte[2] := cx; pkte[3] := cy;
  174.           ComputeBezier(BezierArray, 20, sx1, sy1, cx, cy, sx2, sy2,
  175.                   LastMinX, LastMinY, LastMaxX, LastMaxY);
  176.           dum := MagicVDI.SetLinewidth ( mtAppl.VDIHandle , CommonData.LineWidth ) ;
  177.           MagicVDI.Polyline ( mtAppl.VDIHandle , 21 , BezierArray  ) ;
  178.           dum := MagicVDI.SetLinewidth ( mtAppl.VDIHandle , 1 ) ;
  179.           MagicVDI.Polyline ( mtAppl.VDIHandle , 3 , pkte  ) ;
  180.           FinishDraw; (* Zeichnung beendet *)
  181.         END;
  182.       END;
  183.       lastx := cx; lasty := cy;
  184.     UNTIL (lbut OR rbut);
  185.  
  186.     PrepareDraw; (* Bereite Ausgabe vor *)
  187.     dum := MagicVDI.SetWritemode ( mtAppl.VDIHandle , MagicVDI.XOR ) ;
  188.     dum := MagicVDI.SetLinewidth ( mtAppl.VDIHandle , 1 ) ;
  189.     MagicVDI.Polyline ( mtAppl.VDIHandle , 3 , pkte  ) ;
  190.     dum := MagicVDI.SetLinewidth ( mtAppl.VDIHandle , CommonData.LineWidth ) ;
  191.     MagicVDI.Polyline ( mtAppl.VDIHandle , 21 , BezierArray  ) ;
  192.     FinishDraw; (* Zeichnung beendet *)
  193.  
  194.     WaitForDepress(lastx, lasty);
  195.     IF (lbut) AND NOT (rbut) THEN
  196.       Diverses.GetHelpText(5, helptxt);
  197.       pos := 0;
  198.       WHILE (helptxt[pos]<>'?') DO
  199.         INC(pos);
  200.       END;
  201.       Points := 50;
  202.       REPEAT
  203.         MousePos(lastx, lasty, picx, picy, lbut, rbut);
  204.       UNTIL NOT (lbut OR rbut);
  205.  
  206.       MagicVDI.Text ( mtAppl.VDIHandle ,
  207.                                CommonData.DYPosx ,
  208.                                CommonData.DYPosy , '     ' ) ;
  209.       PrepareDraw; (* Bereite Ausgabe vor *)
  210.       ComputeBezier(BezierArray, Points, sx1, sy1, cx, cy, sx2, sy2,
  211.                   LastMinX, LastMinY, LastMaxX, LastMaxY);
  212.       IF CommonData.ShowBezLine THEN
  213.         dum := MagicVDI.SetLinewidth ( mtAppl.VDIHandle , CommonData.LineWidth ) ;
  214.         MagicVDI.Polyline ( mtAppl.VDIHandle , Points + 1 , BezierArray  ) ;
  215.        ELSE
  216.         MagicVDI.Polymarker ( mtAppl.VDIHandle , Points + 1 , BezierArray  ) ;
  217.       END;
  218.       FinishDraw; (* Zeichnung beendet *)
  219.       MagicConvert.IntToStr(Points, 5, string);
  220.       FOR i:= 0 TO 4 DO
  221.         helptxt[pos+i] := string[i];
  222.       END;
  223.       MagicVDI.Text ( mtAppl.VDIHandle ,
  224.                                CommonData.DXPosx ,
  225.                                CommonData.DXPosy , string ) ;
  226.       HelpModule.HelpMessage(helptxt);
  227.  
  228.       REPEAT
  229.         MousePos(cx2, cy2, picx, picy, lbut, rbut);
  230.         IF (cx2<>lastx) THEN
  231.    (* Bei g